#!/bin/bash

# 获取脚本所在的目录
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")

# 变量设置
PROTO_FILES='./*.proto'  # 匹配当前目录下的所有 .proto 文件
IMPORT_PATH='./'         # 请根据需要更改这里的导入路径
DST_DIR='.'              # 请根据需要更改这里的输出目录
STATIC_LIB_NAME='libprotobufProtocol.a'  # 定义静态库的名称
STATIC_LIB_DIR="${DST_DIR}/lib"          # 定义静态库的目标目录

# 创建子目录
INCLUDE_DIR="${DST_DIR}/include"
SRC_DIR="${DST_DIR}/src"

# 参数解析
BUILD_STATIC=0
while [[ "$#" -gt 0 ]]; do
    case $1 in
        --clean) CLEAN=1 ;;
        --build-static) BUILD_STATIC=1 ;;
        *) echo "未知参数: $1"; exit 1 ;;
    esac
    shift
done

# 切换到脚本所在目录
cd "$SCRIPT_DIR" || exit

# 清理生成的文件
if [[ "$CLEAN" -eq 1 ]]; then
    echo "清理生成的文件..."
    rm -rf "${INCLUDE_DIR}" "${SRC_DIR}" "${STATIC_LIB_DIR}"
    exit 0
fi

# 检查输出目录是否存在，如果不存在则创建
mkdir -p "$INCLUDE_DIR"
mkdir -p "$SRC_DIR"
mkdir -p "$STATIC_LIB_DIR"

# 执行 protoc 命令编译每个 .proto 文件
for PROTO_FILE in $PROTO_FILES; do
    ./protoc --proto_path="${IMPORT_PATH}" --cpp_out="${DST_DIR}" "$PROTO_FILE"
    
    # 检查命令是否成功执行
    if [ $? -ne 0 ]; then
        echo "编译失败: $PROTO_FILE"
        exit 1
    fi
done

echo "编译完成: 所有 .proto 文件 -> ${DST_DIR}"

# 将生成的 .h 文件移动到 include/ 目录
find "${DST_DIR}" -name "*.h" -exec mv {} "${INCLUDE_DIR}/" \;

# 将生成的 .cc 文件移动到 src/ 目录
find "${DST_DIR}" -name "*.cc" -exec mv {} "${SRC_DIR}/" \;

# 编译源文件为静态库
if [[ "$BUILD_STATIC" -eq 1 ]]; then
    echo "开始编译静态库: ${STATIC_LIB_NAME}"
    gcc -c "${SRC_DIR}"/*.cc -I"${INCLUDE_DIR}" -I"../include/"
    ar rcs "${STATIC_LIB_DIR}/${STATIC_LIB_NAME}" ./*.o
    rm ./*.o
    echo "编译静态库完成: ${STATIC_LIB_NAME} ->${STATIC_LIB_DIR}"
fi
